package Screen;

##########################
#     OmnibusProxy       #
#    Krzysztof Ulman     #
# Politechnika Krakowska #
#      Kraków 2012       #
##########################

use strict;
use warnings;
use encoding 'utf8';

use Log::Log4perl;
use Try::Tiny;

use AppConfig;
use Constants;

#czy informacje maja byc wypisywane na ekran
our $SCREEN_IS_ACTIVE = 1;	
our $infoPrinted = 0;
our $logger;
our $logId = 0;

#dodatkowe logowanie do pliku
our $ADDITIONAL_LOGGING = 0;
our $SPECIAL_FILE_LOGGING = 1;

sub init {
	my $self = shift;
	my $mode = shift;
	if(!$mode) {
		$mode = Constants->MODE_NORMAL;
	}
	$logger = Log::Log4perl->get_logger("Screen");
	if($mode == Constants->MODE_NORMAL) {
		$SCREEN_IS_ACTIVE = AppConfig->getProperty('SCREEN_IS_ACTIVE');
	} elsif($mode == Constants->MODE_TEST) {
		$SCREEN_IS_ACTIVE = 0;
	}
	if($infoPrinted == 0) {
		if($SCREEN_IS_ACTIVE) {
			printAndLogDebug($self, $logger, 'Wypisywanie informacji na ekran: AKTYWNE');
		}
		else {
			printAndLogDebug($self, $logger, 'Wypisywanie informacji na ekran: WYLACZONE');
		}
		$infoPrinted++;
	}
}

#funkcja wypisuje informacje na ekran
sub show {
	if($SCREEN_IS_ACTIVE) {
		my $level = shift;
		my $message = shift;
		print '[' . ++$logId . '][' . $level . "]\t" . $message . "\n";
	}
}

#trace - level 1
sub printAndLogTrace {
	if(@_ == 3) {
		my $self = shift;
		my $log = shift;
		my $message = shift;
		if($log->is_trace()) {
			show('TRACE', $message);
			$log->trace($message);
		}
	}
	else {
		my $self = shift;
		my $message = shift;
		if($logger->is_trace()) {
			show('TRACE', $message);
			$logger->trace($message);
		}
	}
}

#debug - level 2
sub printAndLogDebug {
	if(@_ == 3) {
		my $self = shift;
		my $log = shift;
		my $message = shift;
		if($log->is_debug()) {
			show('DEBUG', $message);
			$log->debug($message);
		}
	} elsif(@_ == 2) {
		my $self = shift;
		my $message = shift;
		if($logger->is_debug()) {
			show('DEBUG', $message);
			$logger->debug($message);
		}
	} else {
		$logger->error("Screen::printAndLogDebug nieprawidlowa liczba argumentow");
	}
}

#info - level 3
sub printAndLogInfo {
	if(@_ == 3) {
		my $self = shift;
		my $log = shift;
		my $message = shift;
		if($log->is_info()) {
			show('INFO', $message);
			$log->info($message . "\n");
		}
	}
	else {
		my $self = shift;
		my $message = shift;
		if($logger->is_info()) {
			show('INFO', $message);
			$logger->info($message . "\n");
		}
	}
}

#warn - level 4
sub printAndLogWarn {
	if(@_ == 3) {
		my $self = shift;
		my $log = shift;
		my $message = shift;
		if($log->is_warn()) {
			show('WARN', $message);
			$log->warn($message . "\n");
		}
	}
	elsif(@_ == 2) {
		my $self = shift;
		my $message = shift;
		if($logger->is_warn()) {
			show('WARN', $message);
			$logger->warn($message . "\n");
		}
	}
}

#error - level 5
sub printAndLogError {
	if(@_ == 3) {
		my $self = shift;
		my $log = shift;
		my $message = shift;
		if($log->is_error()) {
			show('ERROR', $message);
			$log->error($message . "\n");
		}
	}
	elsif(@_ == 2) {
		my $self = shift;
		my $message = shift;
		if($logger->is_error()) {
			show('ERROR', $message);
			$logger->error($message . "\n");
		}
	}
}

#fatal - level 6
sub printAndLogFatal {
	if(@_ == 3) {
		my $self = shift;
		my $log = shift;
		my $message = shift;
		if($log->is_fatal()) {
			show('FATAL', $message);
			$log->fatal($message . "\n");
		}
	}
	elsif(@_ == 2) {
		my $self = shift;
		my $message = shift;
		if($logger->is_fatal()) {
			show('FATAL', $message);
			$logger->fatal($message . "\n");
		}
	}
}

#inicjuje dodatkowe logowanie
sub initAdditionalLogging {
	my $class = shift;
	if($ADDITIONAL_LOGGING) {
		additionalLog($class, '------------------------');
	}
}

#zapis dodatkowych danych do pliku
sub additionalLog {
	my $class = shift;
	my $message = shift;
	if($ADDITIONAL_LOGGING) {
		try {
			#otwarcie pliku w trybie dopisywania
			open(FILE, ">>additional.log") || die('Nie mozna otworzyc pliku additional.log w trybie do dopisywania');
			#zapisanie informacji
			print FILE $message . "\n";
			#zamkniecie pliku	
			close(FILE);
		} catch {
			my $e = $_;
			printAndLogError($class, 'Nie mozna zalogowac dodatkowych danych: ' . $e);
			try {
				close(FILE);
			} catch {
				my $e2 = $_;
				printAndLogError($class, 'Nie mozna zamknac pliku: ' . $e2);
			};
		};
	}
}

sub logToSpecialFile {
	my $class = shift;
	my $fileName = shift;
	my $message = shift;
	if($SPECIAL_FILE_LOGGING) {
		try {
			#otwarcie pliku w trybie dopisywania
			open(FILE, ">>$fileName") || die('Nie mozna otworzyc pliku $fileName w trybie do dopisywania');
			#zapisanie informacji
			print FILE $message . "\n";
			#zamkniecie pliku	
			close(FILE);
		} catch {
			my $e = $_;
			printAndLogError($class, 'Nie mozna zalogowac dodatkowych danych: ' . $e);
			try {
				close(FILE);
			} catch {
				my $e2 = $_;
				printAndLogError($class, 'Nie mozna zamknac pliku: ' . $e2);
			};
		};
	}
}

1;